package servlets;

import clases.Paginacion;
import clases.Usuario;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class control extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //Cogemos la ruta para usar con el redirect
        String ruta = getServletContext().getContextPath();

        try {

            //Cogemos el parámetro opcion de la petición
            String opcion = request.getParameter("opcion");

            //Según el valor de opción haremos una cosa
            if (opcion == null) { // ########################################### <==== [null]

                //<editor-fold defaultstate="collapsed" desc="Si no hay opción vamos al Index">
                //Si no hay ninguna opcion vamos al index.jsp
                response.sendRedirect(ruta + "/index.jsp");
                //</editor-fold>

            } else if (opcion.equals("nuevo")) { // ############################ <==== Nuevo

                //<editor-fold defaultstate="collapsed" desc="Crear un nuevo usuario">
                //Depende de si tenemos un id o no sabremos si vamos a crear un nuevo usuario o ya lo hemos hecho
                if (request.getParameter("id") == null) {
                    //Como vamos a crear un usuario nuevo, eliminamos al usuario seleccionado
                    HttpSession session = request.getSession();
                    session.setAttribute("usuario", null);
                    //Vamos a crear un usuario nuevo: Redireccionamos a la página de datos
                    request.getRequestDispatcher("/datos.jsp").forward(request, response);
                } else {
                    //Ya hemos puesto los datos y tenemos que crearlo
                    Usuario nuevoUsuario = new Usuario();
                    nuevoUsuario.setNombre(request.getParameter("nombre"));
                    nuevoUsuario.setApellido(request.getParameter("apellido"));
                    nuevoUsuario.setTelefono(request.getParameter("telefono"));
                    nuevoUsuario.setMail(request.getParameter("mail"));
                    nuevoUsuario.setActivo(true);
                    nuevoUsuario.nuevo();
                    //Lo ideal es que una vez que hemos creado al usuario, se quede seleccionado
                    HttpSession session = request.getSession();
                    session.setAttribute("usuario", nuevoUsuario);
                    //Pasamos el título que se mostrará en la confirmacion
                    String titulo = "Se ha creado al usuario";
                    //Lo metemos en el request
                    request.setAttribute("titulo", titulo);
                    //Redireccionamos a confirmación para mostrar el mensaje
                    request.getRequestDispatcher("/confirmacion.jsp").forward(request, response);
                }
                //</editor-fold>

            } else if (opcion.equals("editar")) { // ########################### <==== Editar

                //<editor-fold defaultstate="collapsed" desc="Editar un usuario que esté seleccionado">
                //Depende de si tenemos un id o no sabremos si vamos a editar o ya hemos editado
                if (request.getParameter("id") == null) {
                    //Vamos a editar al usuario seleccionado: Redireccionamos a la página de datos
                    request.getRequestDispatcher("/datos.jsp").forward(request, response);
                } else {
                    //Ya hemos editado al usuario y tenemos que guardar
                    HttpSession session = request.getSession();
                    Usuario usuario = (Usuario) session.getAttribute("usuario");
                    usuario.setNombre(request.getParameter("nombre"));
                    usuario.setApellido(request.getParameter("apellido"));
                    usuario.setTelefono(request.getParameter("telefono"));
                    usuario.setMail(request.getParameter("mail"));
                    usuario.actualizar();
                    //Pasamos el título que se mostrará en la confirmacion
                    String titulo = "Se ha editado al usuario";
                    //Lo metemos en el request
                    request.setAttribute("titulo", titulo);
                    //Redireccionamos a confirmación para mostrar el mensaje
                    request.getRequestDispatcher("/confirmacion.jsp").forward(request, response);
                }
                //</editor-fold>

            } else if (opcion.equals("borrar")) { // ########################### <==== Borrar

                //<editor-fold defaultstate="collapsed" desc="Borrar un usuario que esté seleccionado">
                if (request.getParameter("confirmado") == null) {
                    //Para borrar, primero vamos a estasseguro.jsp
                    request.getRequestDispatcher("/estasseguro.jsp").forward(request, response);
                } else {
                    //Si ya hemos pasado por la confirmación, tenemos el parámetro "confirmado"
                    HttpSession session = request.getSession();
                    Usuario usuario = (Usuario) session.getAttribute("usuario");
                    //Realmente no borramos, solo le damos de baja
                    usuario.setActivo(false);
                    usuario.actualizar();
                    //Lo quitamos de la session
                    session.setAttribute("usuario", null);
                    //Pasamos el título que se mostrará en la confirmacion
                    String titulo = "Se ha borrado al usuario";
                    //Lo metemos en el request
                    request.setAttribute("titulo", titulo);
                    //Le pasamos también en el request al usuario que acabamos de borrar
                    request.setAttribute("usuario", usuario);
                    //Redireccionamos a confirmación para mostrar el mensaje de que se ha borrado
                    request.getRequestDispatcher("/confirmacion.jsp").forward(request, response);
                }
                //</editor-fold>

            } else if (opcion.equals("lista")) { // ############################ <==== Lista

                //<editor-fold defaultstate="collapsed" desc="Muestra una lista de usuarios según búsqueda">
                //Vemos si tenemos algún parámetro de búsqueda
                String buscar = request.getParameter("buscar");
                //Si no hay ninguno, lo dejamos como cadena vacía
                if (buscar == null) {
                    buscar = ""; //Así buscará todo
                }
                //Metemos el valor en el request para usar con el jsp
                request.setAttribute("buscar", buscar);
                //Creamos el objeto paginación
                Paginacion paginacion = new Paginacion(request.getParameter("pag"), Usuario.contarBusqueda(buscar), 15);
                //Y lo metemos en el request para usarlo en la jsp
                request.setAttribute("paginacion", paginacion);
                //Pedimos la lista de usuarios a la persistencia y la metemos en el request para usarlo en la jsp
                request.setAttribute("listUsuario", Usuario.seleccionarBusqueda(buscar, paginacion.offset(), paginacion.limit()));
                //Ver la lista de usuarios: Redireccionamos a la página de listado
                request.getRequestDispatcher("/lista.jsp").forward(request, response);
                //</editor-fold>

            } else if (opcion.equals("seleccionar")) { // ###################### <==== Seleccionar

                //<editor-fold defaultstate="collapsed" desc="Seleccionar un usuario">
                //Seleccionar un usuaario para editar o borrar
                try {
                    //Cogemos la id del usuario de la petición
                    String stringId = request.getParameter("id");
                    //Lo pasamos a entero
                    int id = Integer.parseInt(stringId);
                    //Cogemos el usuario de la persistencia
                    Usuario usuario = Usuario.seleccionarPorId(id);
                    //Si hay algún problema con el usuario lanzamos una excepción
                    if (usuario == null) {
                        throw new Exception("Usuario no encontrado");
                    }
                    //Si ha ido bien y tenemos al usuario lo guardamos en la session
                    HttpSession session = request.getSession();
                    session.setAttribute("usuario", Usuario.seleccionarPorId(id));
                } catch (Exception ex) {
                    //En caso de error seleccionando al usuario no hacemos nada,
                    //simplemente volvemos a index sin seleccionar :S
                } finally {
                    //En cualquier caso, nos vamos al index.jsp
                    response.sendRedirect(ruta + "/index.jsp");
                }
                //</editor-fold>

            } else if (opcion.equals("deseleccionar")) { // #################### <==== Deseleccionar

                //<editor-fold defaultstate="collapsed" desc="De-Selecciona al usuario seleccionado">
                //Dejar de seleccionar al usuario seleccionado: lo quitamos de la session
                HttpSession session = request.getSession();
                session.setAttribute("usuario", null);
                //Y nos vamos al index.jsp
                response.sendRedirect(ruta + "/index.jsp");
                //</editor-fold>

            }

        } catch (Exception ex) {

            //<editor-fold defaultstate="collapsed" desc="Si hay un error, vamos a error.jsp">
            //Si se produce un error, lo mostramos en la página de error
            request.setAttribute("error", ex);
            //Redireccionamos a confirmación para mostrar el mensaje
            request.getRequestDispatcher("/error.jsp").forward(request, response);
            //</editor-fold>

        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
